#include "myjson.h"

MyJson* MyJson::myjson=nullptr;
const QByteArray aeskey="12345678901234534542346456567890";
const QByteArray aesvi="3523465473547234";

MyJson::MyJson(){}

MyJson *MyJson::getInstance()
{
    if(!myjson)
    {
        myjson=new MyJson;
    }
    return myjson;
}

QByteArray MyJson::logIn(const QString &useroc, const QString &password)
{
    QJsonObject rootobject;
    rootobject.insert("type","login");

    QJsonObject contentobject;
    contentobject.insert("useroc",useroc);
    contentobject.insert("password",password);
    rootobject.insert("content",contentobject);

    QJsonDocument doc(rootobject);
    QByteArray arr= doc.toJson();
    return arr;
}

QByteArray MyJson::logOut(const QString &useroc)
{
    QJsonObject rootobject;
    rootobject.insert("type","logout");

    QJsonObject contentobject;
    contentobject.insert("useroc",useroc);
    rootobject.insert("content",contentobject);

    QJsonDocument doc(rootobject);
    QByteArray arr= doc.toJson();

    return arr;
}

QByteArray MyJson::updateUserName(const QString &useroc, const QString &newname)
{
    QJsonObject rootobject;
    rootobject.insert("type","updateusername");

    QJsonObject contentobject;
    contentobject.insert("useroc",useroc);
    contentobject.insert("newname",newname);
    rootobject.insert("content",contentobject);

    QJsonDocument doc(rootobject);
    QByteArray arr= doc.toJson();

    return arr;
}

QByteArray MyJson::sendMessage(const QString &useroc, const QString &targetoc, const QString &message)
{
    QJsonObject rootobject;
    rootobject.insert("type","csmessage");

    QJsonObject contentobject;
    contentobject.insert("useroc",useroc);
    contentobject.insert("targetoc",targetoc);
    contentobject.insert("message",message);
    rootobject.insert("content",contentobject);

    QJsonDocument doc(rootobject);
    QByteArray arr= doc.toJson();

    return arr;
}

void MyJson::myJsonInit(const QString &useroc)
{
    this->useroc=useroc;
    Encipher::setAesKey(aeskey);
    Encipher::setAesiv(aesvi);
    CustomHandler::setUseroc(useroc);
}

void MyJson::analysisJson(const QByteArray &decrypt)
{

    int index=-1;
    int tmp=0;
    while (tmp!=-1) {
        index=tmp;
        tmp=CustomHandler::getInstance()->KMPSIndexOf(decrypt,"#$^",index+1);
    }
    //有效载荷
    QByteArray payload=decrypt.mid(0,index);
    //校验值
    QByteArray sha256=decrypt.mid(index+3);
    //校验报文
    if(!Encipher::getInstance()->validate(payload,sha256))
    {
        qDebug()<<"报文不完整";
        return;
    }
    QJsonParseError error;
    QJsonDocument doc=QJsonDocument::fromJson(payload,&error);
    //json
    if(error.error==QJsonParseError::NoError)
    {
        JSHandler::getInstance()->handle(doc);
    }
    //#
    else if(decrypt[0]=='#'&&decrypt[1]=='$'&&decrypt[2]=='^')
    {
        CustomHandler::getInstance()->handle(payload);
    }
    else
    {
        qDebug()<<"无效报文";
    }

}

QByteArray MyJson::getFriendInfo(const QString &useroc, const QString &targetoc)
{
    QJsonObject rootobject;
    rootobject.insert("type","getfriendinfo");

    QJsonObject contentobject;
    contentobject.insert("useroc",useroc);
    contentobject.insert("targetoc",targetoc);
    rootobject.insert("content",contentobject);

    QJsonDocument doc(rootobject);
    QByteArray arr= doc.toJson();

    return arr;
}

QByteArray MyJson::sendFriendApply(const QString &useroc, const QString &targetoc)
{
    QJsonObject rootobject;
    rootobject.insert("type","friendapply");

    QJsonObject contentobject;
    contentobject.insert("useroc",useroc);
    contentobject.insert("targetoc",targetoc);
    rootobject.insert("content",contentobject);

    QJsonDocument doc(rootobject);
    QByteArray arr= doc.toJson();

    return arr;
}

QByteArray MyJson::sendFriendApplyResult(const QString &useroc, const QString &targetoc)
{
    QJsonObject rootobject;
    rootobject.insert("type","friendapplyaccess");

    QJsonObject contentobject;
    contentobject.insert("useroc",useroc);
    contentobject.insert("targetoc",targetoc);
    rootobject.insert("content",contentobject);

    QJsonDocument doc(rootobject);
    QByteArray arr= doc.toJson();

    return arr;
}

QByteArray MyJson::updateUserOC(const QString &useroc, const QString &newoc)
{
    QJsonObject rootobject;
    rootobject.insert("type","updateuseroC");

    QJsonObject contentobject;
    contentobject.insert("useroc",useroc);
    contentobject.insert("newname",newoc);
    rootobject.insert("content",contentobject);

    QJsonDocument doc(rootobject);
    QByteArray arr= doc.toJson();

    return arr;
}

QByteArray MyJson::getContactList(const QString &useroc)
{
    QJsonObject rootobject;
    rootobject.insert("type","getcontactlist");

    QJsonObject contentobject;
    contentobject.insert("useroc",useroc);
    rootobject.insert("content",contentobject);

    QJsonDocument doc(rootobject);
    QByteArray arr= doc.toJson();

    return arr;
}

QByteArray MyJson::getUserInfo(const QString &useroc)
{
    QJsonObject rootobject;
    rootobject.insert("type","getuserinfo");

    QJsonObject contentobject;
    contentobject.insert("useroc",useroc);
    rootobject.insert("content",contentobject);

    QJsonDocument doc(rootobject);
    QByteArray arr= doc.toJson();

    return arr;
}

QByteArray MyJson::updateUserAvatar(const QString &useroc, const QString &avatarpath)
{
    QFile file(avatarpath);
    if(!file.open(QIODevice::ReadOnly))
    {
        qDebug()<<"open file failed";
    }
    QByteArray arr=QString("#$^%1#$^%2#$^").arg("updateUserAvatar").arg(useroc).toUtf8();
    arr.append(file.readAll());

    return arr;
}

QByteArray MyJson::signUp(const QString &useroc, const QString &username, const QString &password ,const QString &avatarpath)
{
    QFile file(avatarpath);
    if(!file.open(QIODevice::ReadOnly))
    {
        qDebug()<<"open file failed";
    }
    QByteArray arr=QString("#$^%1#$^%2#$^%3#$^%4#$^").arg("signup").arg(useroc).arg(username).arg(password).toUtf8();
    arr.append(file.readAll());

    return arr;
}

QByteArray MyJson::sendFileHead(const QString &senderoc, const QString &targetoc, const QString &filepath)
{
    QFile file(filepath);
    file.open(QIODevice::ReadOnly);
    QFileInfo info(file);
    QString filename=info.fileName();
    unsigned long filesize=info.size();
    QByteArray filesha256=Encipher::getInstance()->sha256(file.readAll());
    qDebug()<<senderoc<<targetoc<<filesize<<filesha256<<filename;

    QJsonObject rootobject;
    rootobject.insert("type","csfilehead");

    QJsonObject contentobject;
    contentobject.insert("senderoc",senderoc);
    contentobject.insert("targetoc",targetoc);
    contentobject.insert("filesize",QString::number(filesize));
    contentobject.insert("filesha256",QString::fromUtf8(filesha256));
    contentobject.insert("filename",filename);
    rootobject.insert("content",contentobject);

    QJsonDocument doc(rootobject);
    QByteArray arr= doc.toJson();

    return arr;
}

QByteArray MyJson::fileBlock(const unsigned int index, const unsigned int blocksize, const QByteArray &fileblock)
{
    QByteArray arr(QString("#$^%1#$^%2#$^%3#$^").arg("fileblock").arg(index).arg(blocksize).toUtf8());

    arr.append(fileblock);

    return arr;
}

QByteArray MyJson::sendFileEnd()
{
    QJsonObject rootobject;
    rootobject.insert("type","fileend");

    QJsonDocument doc(rootobject);
    QByteArray arr= doc.toJson();

    qDebug()<<arr;

    return arr;
}




QByteArray MyJson::testmessage(const QString &type, const QByteArrayList &arglist)
{
    QJsonObject rootobject;
    rootobject.insert("type",type);

    QJsonObject contentobject;
    int count=0;
    for(QByteArray i:arglist)
    {
        QString tmp=QString("arg%1").arg(count++);
        contentobject.insert(tmp,QString::fromUtf8(i));
    }

    rootobject.insert("content",contentobject);
    QJsonDocument doc(rootobject);
    QByteArray arr= doc.toJson();

    return arr;
}

QByteArray MyJson::testfile(const QString &type, const QByteArrayList &arglist, const QString &path)
{
    QByteArray arr(QString("#$^%1").arg(type).toUtf8());
    for(QByteArray i:arglist)
    {
        arr.append("#$^").append(i);
    }
    QFile file(path);
    file.open(QIODevice::ReadOnly);
    QByteArray filearr=file.readAll();
    arr.append("#$^").append(filearr);

    return arr;
}

QByteArray MyJson::fileReady()
{
    QJsonObject rootobject;
    rootobject.insert("type","fileready");

    QJsonDocument doc(rootobject);
    QByteArray arr= doc.toJson();


    return arr;
}

